/**
 * 交互工具类 - 提供统一的用户交互方法
 */
import { Dialog, Toast, Notify } from 'vant'
import 'vant/es/dialog/style'
import 'vant/es/toast/style'
import 'vant/es/notify/style'

/**
 * 显示确认对话框
 * @param {Object} options - 配置项
 * @param {string} [options.title='确认操作'] - 对话框标题
 * @param {string} [options.message='是否确认执行此操作？'] - 对话框内容
 * @param {string} [options.confirmButtonText='确认'] - 确认按钮文本
 * @param {string} [options.cancelButtonText='取消'] - 取消按钮文本
 * @param {string} [options.confirmButtonColor='#1989fa'] - 确认按钮颜色
 * @returns {Promise} 返回Promise，确认时resolve，取消时reject
 */
export const showConfirmDialog = (options = {}) => {
  return Dialog.confirm({
    title: options.title || '确认操作',
    message: options.message || '是否确认执行此操作？',
    confirmButtonText: options.confirmButtonText || '确认',
    cancelButtonText: options.cancelButtonText || '取消',
    confirmButtonColor: options.confirmButtonColor || '#1989fa'
  })
}

/**
 * 显示带输入框的对话框
 * @param {Object} options - 配置项
 * @param {string} [options.title='请输入'] - 对话框标题
 * @param {string} [options.message=''] - 对话框提示文本
 * @param {string} [options.inputPlaceholder='请输入内容'] - 输入框占位文本
 * @param {string} [options.inputType='text'] - 输入框类型
 * @param {Function} [options.validator] - 输入验证函数
 * @returns {Promise<string>} 返回用户输入的内容
 */
export const showPromptDialog = (options = {}) => {
  return new Promise((resolve, reject) => {
    const inputValue = { value: '' }
    
    Dialog({
      title: options.title || '请输入',
      message: options.message || '',
      showCancelButton: true,
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      className: 'prompt-dialog',
      beforeClose: (action, done) => {
        if (action === 'confirm') {
          // 如果有验证函数，则进行验证
          if (options.validator) {
            const validResult = options.validator(inputValue.value)
            if (validResult !== true) {
              Toast(validResult || '输入内容无效')
              return
            }
          }
          resolve(inputValue.value)
        } else {
          reject()
        }
        done()
      },
    })
    
    // 手动创建输入框
    setTimeout(() => {
      const dialogEl = document.querySelector('.prompt-dialog')
      if (dialogEl) {
        const inputEl = document.createElement('input')
        inputEl.className = 'dialog-input'
        inputEl.type = options.inputType || 'text'
        inputEl.placeholder = options.inputPlaceholder || '请输入内容'
        inputEl.style.width = '100%'
        inputEl.style.padding = '10px'
        inputEl.style.boxSizing = 'border-box'
        inputEl.style.border = '1px solid #ebedf0'
        inputEl.style.borderRadius = '4px'
        inputEl.style.marginTop = '12px'
        
        inputEl.addEventListener('input', (e) => {
          inputValue.value = e.target.value
        })
        
        const messageEl = dialogEl.querySelector('.van-dialog__message')
        messageEl.appendChild(inputEl)
        
        // 自动聚焦
        inputEl.focus()
      }
    }, 50)
  })
}

/**
 * 显示成功通知
 * @param {string} message - 通知内容
 * @param {number} [duration=2000] - 显示时长(ms)
 */
export const showSuccess = (message, duration = 2000) => {
  Toast.success({
    message,
    duration
  })
}

/**
 * 显示失败通知
 * @param {string} message - 通知内容
 * @param {number} [duration=2000] - 显示时长(ms)
 */
export const showError = (message, duration = 2000) => {
  Toast.fail({
    message,
    duration
  })
}

/**
 * 显示警告通知
 * @param {string} message - 通知内容
 * @param {number} [duration=2000] - 显示时长(ms)
 */
export const showWarning = (message, duration = 3000) => {
  Notify({
    type: 'warning',
    message
  })
}

/**
 * 显示加载提示
 * @param {string} [message='加载中...'] - 提示文本
 * @returns {Function} 返回关闭加载提示的函数
 */
export const showLoading = (message = '加载中...') => {
  Toast.loading({
    message,
    forbidClick: true,
    duration: 0
  })
  
  return () => {
    Toast.clear()
  }
}

/**
 * 处理API错误
 * @param {Error} error - 错误对象
 * @param {string} [customMessage] - 自定义错误消息
 */
export const handleApiError = (error, customMessage) => {
  console.error(error)
  
  if (!navigator.onLine) {
    showError('网络连接已断开，请检查网络设置')
    return
  }
  
  const message = customMessage || 
    error.response?.data?.message || 
    error.message || 
    '操作失败，请稍后重试'
  
  showError(message)
}

export default {
  showConfirmDialog,
  showPromptDialog,
  showSuccess,
  showError,
  showWarning,
  showLoading,
  handleApiError
} 